package com.zenithmind.coding.controller.base;

import com.zenithmind.common.context.UserContext;
import com.zenithmind.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 基础控制器类 - 遵循依赖倒置原则，提供通用的控制器功能
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Slf4j
public abstract class BaseController {

    /**
     * 获取当前用户ID
     * 
     * @return 用户ID
     */
    protected String getCurrentUserId() {
        String userId = UserContext.getUserId();
        if (!StringUtils.hasText(userId)) {
            throw new IllegalStateException("用户未登录");
        }
        return userId;
    }

    /**
     * 获取当前用户名
     * 
     * @return 用户名
     */
    protected String getCurrentUsername() {
        String username = UserContext.getUsername();
        if (!StringUtils.hasText(username)) {
            throw new IllegalStateException("用户信息不完整");
        }
        return username;
    }

    /**
     * 获取当前用户角色列表
     *
     * @return 用户角色列表
     */
    protected List<String> getCurrentUserRoles() {
        return UserContext.getUserRoles();
    }

    /**
     * 获取当前用户主要角色（第一个角色）
     *
     * @return 用户主要角色
     */
    protected String getCurrentUserRole() {
        List<String> roles = UserContext.getUserRoles();
        return roles.isEmpty() ? null : roles.get(0);
    }

    /**
     * 检查用户是否已登录
     * 
     * @return 是否已登录
     */
    protected boolean isUserLoggedIn() {
        return StringUtils.hasText(UserContext.getUserId());
    }

    /**
     * 检查用户是否有管理员权限
     * 
     * @return 是否为管理员
     */
    protected boolean isAdmin() {
        String role = getCurrentUserRole();
        return "ADMIN".equals(role) || "SUPER_ADMIN".equals(role);
    }

    /**
     * 检查用户是否有教师权限
     * 
     * @return 是否为教师
     */
    protected boolean isTeacher() {
        String role = getCurrentUserRole();
        return "TEACHER".equals(role) || isAdmin();
    }

    /**
     * 检查用户是否有学生权限
     * 
     * @return 是否为学生
     */
    protected boolean isStudent() {
        String role = getCurrentUserRole();
        return "STUDENT".equals(role);
    }

    /**
     * 验证用户权限
     * 
     * @param requiredRole 需要的角色
     * @throws IllegalAccessException 权限不足时抛出异常
     */
    protected void validateUserRole(String requiredRole) throws IllegalAccessException {
        String currentRole = getCurrentUserRole();
        if (!requiredRole.equals(currentRole) && !isAdmin()) {
            throw new IllegalAccessException("权限不足，需要" + requiredRole + "权限");
        }
    }

    /**
     * 创建成功响应
     * 
     * @param data 响应数据
     * @param <T> 数据类型
     * @return 成功响应
     */
    protected <T> Result<T> success(T data) {
        return Result.success(data);
    }

    /**
     * 创建成功响应（无数据）
     * 
     * @return 成功响应
     */
    protected Result<Void> success() {
        return Result.success();
    }

    /**
     * 创建失败响应
     *
     * @param message 错误消息
     * @return 失败响应
     */
    protected Result<Void> failure(String message) {
        return Result.fail(message);
    }

    /**
     * 记录操作日志
     * 
     * @param operation 操作名称
     * @param details 操作详情
     */
    protected void logOperation(String operation, String details) {
        String userId = UserContext.getUserId();
        String username = UserContext.getUsername();
        log.info("用户操作 - 用户ID: {}, 用户名: {}, 操作: {}, 详情: {}", 
                userId, username, operation, details);
    }

    /**
     * 记录错误日志
     * 
     * @param operation 操作名称
     * @param error 错误信息
     * @param e 异常对象
     */
    protected void logError(String operation, String error, Exception e) {
        String userId = UserContext.getUserId();
        String username = UserContext.getUsername();
        log.error("用户操作错误 - 用户ID: {}, 用户名: {}, 操作: {}, 错误: {}", 
                userId, username, operation, error, e);
    }

    /**
     * 验证分页参数
     * 
     * @param current 当前页
     * @param size 页大小
     */
    protected void validatePageParams(Long current, Long size) {
        if (current == null || current < 1) {
            throw new IllegalArgumentException("当前页必须大于0");
        }
        if (size == null || size < 1 || size > 100) {
            throw new IllegalArgumentException("页大小必须在1-100之间");
        }
    }

    /**
     * 验证ID参数
     * 
     * @param id ID参数
     * @param paramName 参数名称
     */
    protected void validateId(String id, String paramName) {
        if (!StringUtils.hasText(id)) {
            throw new IllegalArgumentException(paramName + "不能为空");
        }
    }
}
